/**
 * 格式化日期
 * @param {string|Date} date 日期对象或日期字符串
 * @param {string} format 格式化模板，默认为 'YYYY-MM-DD'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD') {
  if (!date) return '';
  
  let d;
  
  if (date instanceof Date) {
    d = date;
  } else {
    // 尝试将字符串转换为日期对象
    d = new Date(date);
    
    // 检查日期是否有效
    if (isNaN(d.getTime())) {
      return date; // 如果无法解析，则返回原始值
    }
  }
  
  const year = d.getFullYear();
  const month = String(d.getMonth() + 1).padStart(2, '0');
  const day = String(d.getDate()).padStart(2, '0');
  const hours = String(d.getHours()).padStart(2, '0');
  const minutes = String(d.getMinutes()).padStart(2, '0');
  const seconds = String(d.getSeconds()).padStart(2, '0');
  
  return format
    .replace('YYYY', year)
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hours)
    .replace('mm', minutes)
    .replace('ss', seconds);
}

/**
 * 格式化数字
 * @param {number} num 数字
 * @param {number} precision 小数位数
 * @returns {string} 格式化后的数字字符串
 */
export function formatNumber(num, precision = 2) {
  if (num === null || num === undefined) return '';
  
  return Number(num).toFixed(precision);
}

/**
 * 格式化文件大小
 * @param {number} bytes 字节数
 * @returns {string} 格式化后的文件大小
 */
export function formatFileSize(bytes) {
  if (bytes === 0) return '0 B';
  
  const k = 1024;
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

/**
 * 格式化金额
 * @param {number} amount 金额
 * @param {string} currency 货币符号，默认为 '¥'
 * @returns {string} 格式化后的金额
 */
export function formatCurrency(amount, currency = '¥') {
  if (amount === null || amount === undefined) return '';
  
  return `${currency}${Number(amount).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`;
}

/**
 * 格式化百分比
 * @param {number} value 值
 * @param {number} precision 小数位数
 * @returns {string} 格式化后的百分比
 */
export function formatPercent(value, precision = 2) {
  if (value === null || value === undefined) return '';
  
  return `${(value * 100).toFixed(precision)}%`;
}

/**
 * 截断文本
 * @param {string} text 文本
 * @param {number} length 最大长度
 * @param {string} suffix 后缀，默认为 '...'
 * @returns {string} 截断后的文本
 */
export function truncateText(text, length = 50, suffix = '...') {
  if (!text) return '';
  
  if (text.length <= length) return text;
  
  return text.substring(0, length) + suffix;
} 